from Sodev.colaDePrioridad import ColaDePrioridad
class SchedulerQueueP:
    def __init__(self, cpu):
        self.pcbsListos = ColaDePrioridad()
        self.cpu = cpu
        self.increasePriorityTimer = 10 
        
        
    def agregarPcb(self, pcb, programData):
        self.definirPrioriodad(pcb,programData)
        self.pcbsListos.put(pcb, pcb.getPrioridad())

        
    def runPcb(self):
        if(self.pcbsListos.qsize() >0):
            pcb = self.pcbsListos._get()[2]
            pcb.estado = 'running'
            self.cpu.executeProc(pcb)
        
    def getPcbsListos(self):
        return self.getPcbsListos
    
    def reanudarPCB(self, pcb):
        pcb.estado = 'ready'
        self.decidirEnvejecimiento()
        self.pcbsListos.put(pcb, pcb.prioridad)
     
    def next(self):
        self.runPcb()
        
    '''Decide la prioridad en base a la cantidad de instrucciones'''
    def definirPrioriodad(self,pcb,programData):
        cantDeIntrucciones = self.sizeOfData(programData)
        if(cantDeIntrucciones > 50):
            pcb.prioridad = 4
        elif(cantDeIntrucciones >30 and cantDeIntrucciones <=50):
            pcb.prioridad = 3
        elif(cantDeIntrucciones >10 and cantDeIntrucciones <=30):
            pcb.prioridad = 2
        else:
            pcb.prioriodad = 1
    
    def sizeOfData(self,programData):
        ret = 0
        for b in programData:
            ret = ret + b.size()
        return ret
    
    '''logica de decidir cuando envejecer'''       
    def decidirEnvejecimiento(self):
        if(self.increasePriorityTimer <= 0):
            self.envejecer()
        else:
            self.increasePriorityTimer = self.increasePriorityTimer -1
            
    '''Enveceje a todos los pcb'''   
    def envejecer(self):
        pcbsTemps = ColaDePrioridad()        
        while(self.pcbsListos.qsize()>0):
            pcb = self.pcbsListos.get_()[3]
            if(pcb.prioridad > 0):
                pcb.prioridad = pcb.prioridad -1
            pcbsTemps.put(pcb, pcb.getPrioridad())
                      
        self.pcbsListos = pcbsTemps
            
            
            
            
            
            
            
            
        